package entities;

import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.Table;

@Entity
@Table(name = "AUTEUR")
public class Auteur
{
	private int id;
	private String naam;
	private String voornaam;
	private String tussenvoegsel;
	private Set<Boek> boeken;
	
	// Constructors
	
	/**
	 * Constructor voor Hibernate
	 */
	@SuppressWarnings("unused")
	private Auteur()
	{
		boeken = new HashSet<Boek>();
	}
	
	public Auteur(String naam, String voornaam)
	{
		this.naam = naam;
		this.voornaam = voornaam;
		this.boeken = new HashSet<Boek>();
	}
	
	public Auteur(String naam, String voornaam, Set<Boek> boeken)
	{
		this.naam = naam;
		this.voornaam = voornaam;
		this.boeken = boeken;
	}
	
	public Auteur(String naam, String voornaam, String tussenvoegsel, Set<Boek> boeken)
	{
		this.naam = naam;
		this.voornaam = voornaam;
		this.tussenvoegsel = tussenvoegsel;
		this.boeken = boeken;
	}
	
	// Getters en Setters
	
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	@Column(name = "id")
	public int getId()
	{
		return id;
	}
	public void setId(int id)
	{
		this.id = id;
	}
	@Column(name = "naam")
	public String getNaam()
	{
		return naam;
	}
	public void setNaam(String naam)
	{
		this.naam = naam;
	}
	@Column(name = "voornaam")
	public String getVoornaam()
	{
		return voornaam;
	}
	public void setVoornaam(String voornaam)
	{
		this.voornaam = voornaam;
	}
	@Column(name = "tussenvoegsel")
	public String getTussenvoegsel()
	{
		return tussenvoegsel;
	}
	public void setTussenvoegsel(String tussenvoegsel)
	{
		this.tussenvoegsel = tussenvoegsel;
	}
	//@ManyToMany(mappedBy = "auteurs")
	@ManyToMany(
			cascade = CascadeType.ALL)
	@JoinTable(
			name = "BOEK_AUTEUR",
			joinColumns = { @JoinColumn(name = "auteur_id") },
			inverseJoinColumns = { @JoinColumn(name = "boek_id") })
	public Set<Boek> getBoeken()
	{
		return boeken;
	}
	/**
	 * Verandert de set van boeken die geschreven zijn door deze auteur.
	 * Gebruik deze methode zorgvuldig om te voorkomen dat boeken ongewild worden
	 * verwijderd. Gebruik zoveel mogelijk addBoek() of removeBoek().
	 * @param boeken
	 */
	public void setBoeken(Set<Boek> boeken)
	{
		this.boeken = boeken;
	}
	
	// Methoden
	
	public void addBoek(Boek boek)
	{
		boeken.add(boek);
	}
	public void removeBoek(Boek boek)
	{
		boeken.remove(boek);
	}
	public boolean hasBoek(Boek boek)
	{
		return boeken.contains(boek);
	}
	
	public String toString()
	{
		String tussen = getTussenvoegsel();
		
		if(tussen != null && !tussen.isEmpty())
		{
			tussen = " " + tussen;
		}
		else
		{
			tussen = "";
		}
		
		return getVoornaam() + tussen + " " + getNaam();
	}
}
